package com.example.lemis.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.lemis.model.dto.PageDTO;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;

public interface BaseCurdService<E> extends IService<E> {

    /**
     * 1. 按 QueryDTO 非空字段做等值查询，返回单条
     */
    default <Q> E getOneByExample(Q queryDTO) {
        QueryWrapper<E> wrapper = buildWrapper(queryDTO);
        return getOne(wrapper, false);
    }

    /**
     * 2. 公共封装：把 DTO → QueryWrapper<E>
     */
    private <Q> QueryWrapper<E> buildWrapper(Q dto) {
        QueryWrapper<E> wrapper = new QueryWrapper<>();

        for (Field f : dto.getClass().getDeclaredFields()) {
            f.setAccessible(true);
            Object val;
            try {
                val = f.get(dto);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
            /* 跳过 null / 空串 / pageNo / pageSize 字段 */
            if (shouldSkipField(f, val)) {
                continue;
            }
            // 这里简单用字段名；如果有 @TableField 等映射，可自行扩展
            wrapper.eq(f.getName(), val);
        }
        return wrapper;
    }

    /** 判定是否跳过该字段 */
    private boolean shouldSkipField(Field f, Object val) {
        if (val == null) {                       // null 直接忽略
            return true;
        }
        if (val instanceof String s && !StringUtils.hasText(s)) {
            return true;                         // 空字符串也忽略
        }
        // pageNo、pageSize 不应该入 SQL
        return "pageNo".equals(f.getName()) || "pageSize".equals(f.getName());
    }
}
